昨天有成功使用 Ansible 執行一個 echo
印出東西了,這在 Ansible 裡面稱作 ad hoc 模式,可以用來執行單個 task。不過在實際的應用場景裡面,我們應該都會需要執行多個命令,才能完成整個流程,這種時候就是 playbook 派上用場的時候了。
playbook 由多個 "play" 組成,每個 play 表示我們預計完成的「目標」,並且裡面會包一些 task,也就是為了達成目標所需要做的事情。一個簡單的範例如下面所示(取自官方文件)。
---
- name: Update web servers
hosts: webservers
remote_user: root
tasks:
- name: Ensure apache is at the latest version
ansible.builtin.yum:
name: httpd
state: latest
- name: Write the apache config file
ansible.builtin.template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
- name: Update db servers
hosts: databases
remote_user: root
tasks:
- name: Ensure postgresql is at the latest version
ansible.builtin.yum:
name: postgresql
state: latest
- name: Ensure that postgresql is started
ansible.builtin.service:
name: postgresql
state: started
最上層的 Update web servers
跟 Update db servers
就是這份 playbook 包含的兩個 play,底下透過 hosts
跟 remote_user
分別定義需要執行這份 play 的 host,還有 ssh 連線所使用的 user。
而實際需要執行的 task 就被定義在 tasks
這個 array 裡面,對於每個 task,我們也需要給他一個 name
作為識別,接下來底下就是執行了什麼操作,這邊的 ansible.builtin.template
還有 ansible.builtin.service
等字串在 Ansible 裡面被稱作 module,是會實際給 Ansible 執行的東西,相關的文件可以在這邊找到。
講到 playbook,這邊還要談談有關冪等,因為我們可能會需要執行多次 playbook(像是更新版本的時候),所以需要確保重複執行不會產生意料之外的後果。在 Ansible 中,module 通常會被設計成「讓 host 變成期望的狀態」而不是「執行特定的操作」,所以會比較容易實現冪等。但也不是所有的 module 都遵守這個原則,所以官方建議在使用前還是開個沙盒環境測試一下。
今天翻了好多 Ansible 官方文件,對於一些名詞的定義還不是很清楚,像是 module, collection, role... 之類的,或許我還要再多使用一段時間才能搞懂。